<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora089.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora091.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc121"></A>
<H3> Following the evolution of the heap</H3> In order to follow the evolution of the heap, we suggest writing a
function that keeps information on the heap in the form of a record with
the following format:


<PRE><BR># <B>type</B><CODE> </CODE>tr_gc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{state<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Gc.stat;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>time<CODE> </CODE><CODE>:</CODE><CODE> </CODE>float;<CODE> </CODE>number<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int};;<BR>

</PRE>

The time corresponds to the number of milliseconds since the program
began and the number serves to distinguish between calls. We use the
function <TT>Unix.time</TT> (see chapter <A HREF="index.html#chap-PS">18</A>,
page&nbsp;<A HREF="book-ora165.html#mod-Unix">??</A>) which gives the running time in milliseconds.
<OL type=1>
<LI> Write a function <TT><A id="a203__1_APPEND/GCcor.ml.tex" href="javascript: void showMessage('1_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/GCcor.ml.tex,trace-gc -->trace_gc</SPAN></A></TT> that 
 returns such a record.
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>type</B><CODE> </CODE>tr_gc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{etat<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Gc.stat;<CODE> </CODE><CODE> </CODE>temps<CODE> </CODE><CODE>:</CODE><CODE> </CODE>float;<CODE> </CODE>numero<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int}<CODE> </CODE>;;<BR><CODE>type tr_gc = { etat: Gc.stat; temps: float; numero: int }</CODE><BR># <B>let</B><CODE> </CODE>trace_gc<CODE> </CODE><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>num<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>function</B><CODE> </CODE>()<CODE> </CODE>-&gt;<CODE> </CODE>incr<CODE> </CODE>num;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>etat<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Gc.stat<CODE> </CODE>();<CODE> </CODE><CODE> </CODE>temps<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Unix.time();<CODE> </CODE>numero<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>!</CODE>num}<CODE> </CODE>;;<BR><CODE>val trace_gc : unit -&gt; tr_gc = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a204__2_APPEND/GCcor.ml.tex" href="javascript: void showMessage('2_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/GCcor.ml.tex,trace-out -->Modify</SPAN></A> this function so that it can save a 
 value of type <I>tr_gc</I> in a file in the form of a persistant
 value. This new function needs an output channel in order to write.
 We use the <TT>Marshal</TT> module, described on
 page&nbsp;<A HREF="book-ora076.html#sec-persist">??</A>, to save the record.
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>trace_out_gc<CODE> </CODE>oc<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>trgc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>trace_gc<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Marshal.to_channel<CODE> </CODE>oc<CODE> </CODE><CODE> </CODE>trgc<CODE> </CODE>[];;<BR><CODE>val trace_out_gc : out_channel -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a <A id="a205__3_APPEND/GCcor.ml.tex" href="javascript: void showMessage('3_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/GCcor.ml.tex,visu-gc -->stand-alone program</SPAN></A>, taking as input 
 the name of a file containing records of type of <I>tr_gc</I>, and displaying the
 number of major and minor garbage collections.
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR><B>type</B><CODE> </CODE>tr_gc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{etat<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Gc.stat;<CODE> </CODE>temps<CODE> </CODE><CODE>:</CODE><CODE> </CODE>float;<CODE> </CODE>numero<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int}<CODE> </CODE>;;<BR><BR><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>last<CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>l<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE> </CODE><CODE>"last"</CODE><BR><CODE>|</CODE><CODE> </CODE><CODE>[</CODE>e<CODE>]</CODE><CODE> </CODE>-&gt;<CODE> </CODE>e<BR><CODE>|</CODE><CODE> </CODE>t::q<CODE> </CODE>-&gt;<CODE> </CODE>last<CODE> </CODE><CODE> </CODE>q;;<BR><BR><B>let</B><CODE> </CODE>visu<CODE> </CODE>ltgc<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>fst<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.hd<CODE> </CODE>ltgc<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>lst<CODE> </CODE><CODE>=</CODE><CODE> </CODE>last<CODE> </CODE>ltgc<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>nb_minor<CODE> </CODE><CODE>=</CODE><CODE> </CODE>lst<CODE>.</CODE>etat<CODE>.</CODE>Gc.minor_collections<CODE> </CODE><CODE>-</CODE><CODE> </CODE>fst<CODE>.</CODE>etat<CODE>.</CODE>Gc.minor_collections<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>nb_major<CODE> </CODE><CODE>=</CODE><CODE> </CODE>lst<CODE>.</CODE>etat<CODE>.</CODE>Gc.major_collections<CODE> </CODE><CODE>-</CODE><CODE> </CODE>fst<CODE>.</CODE>etat<CODE>.</CODE>Gc.major_collections<CODE> </CODE><B>in</B><CODE> </CODE><BR><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Nombre de Gc: mineur = %d, majeur = %d\n"</CODE><CODE> </CODE>nb_minor<CODE> </CODE>nb_major<CODE> </CODE>;;<BR><BR><BR><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>read_trace<CODE> </CODE>ic<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>tgc<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT><CODE> </CODE><TT>(</TT>Marshal.from_channel<CODE> </CODE>ic<TT>)</TT><CODE> </CODE><CODE>:</CODE><CODE> </CODE>tr_gc<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>tgc<CODE> </CODE>::<CODE> </CODE><TT>(</TT>read_trace<CODE> </CODE>ic<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End_of_file<CODE> </CODE>-&gt;<CODE> </CODE>close_in<CODE> </CODE>ic;<CODE> </CODE>[];;<BR><CODE> </CODE><BR><B>let</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"usage: visu filename\n"</CODE>;;<BR><BR><B>let</B><CODE> </CODE>main<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>Array.length<CODE> </CODE><TT>(</TT>Sys.argv<TT>)</TT><CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><CODE>2</CODE><CODE> </CODE><B>then</B><CODE> </CODE>usage()<BR><CODE> </CODE><CODE> </CODE><B>else</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ltgc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>read_trace<CODE> </CODE><TT>(</TT>open_in<CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>visu<CODE> </CODE>ltgc;;<BR><BR><BR>main();;<BR><BR><BR><BR><BR><BR><BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Test this program by creating a trace file at the interactive loop
 level.
</OL> <A NAME="toc122"></A>
<H3> Memory Allocation and Programming Styles</H3>
This exercise compares the effect of programming styles on the growth of
the heap. To do this, we reconsider the exercise on prime numbers from
chapter <A HREF="index.html#chap-Bibliotheques">8</A> page&nbsp;<A HREF="book-ora078.html#exo-eratosthene">??</A>.
We are trying to compare two versions, one tail-recursive
and the other not, of the sieve of Eratosthenes.
<BR>
<BR>
<OL type=1>
<LI>
 Write a tail-recursive function <TT><A id="a206__4_APPEND/GCcor.ml.tex" href="javascript: void showMessage('4_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/GCcor.ml.tex,erart -->erart</SPAN></A></TT>  
 (this name needs fixing) that calculates the prime numbers in a given
 interval. Then write a function that takes an integer and returns the
 list of smaller prime numbers.
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 fichier eras2.ml : <BR>
<BR>


<PRE>
<CODE>(* fichier eras2.ml *)</CODE><BR><BR><B>let</B><CODE> </CODE>erart<CODE> </CODE>l<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>erart_aux<CODE> </CODE>l<CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>l<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>List.rev<CODE> </CODE>r<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>p::q<CODE> </CODE>-&gt;<CODE> </CODE>erart_aux<CODE> </CODE><CODE> </CODE><TT>(</TT>List.filter<CODE> </CODE><TT>(</TT><CODE> </CODE><B>fun</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>x<CODE> </CODE><B>mod</B><CODE> </CODE>p<CODE> </CODE><CODE>&lt;&gt;</CODE><CODE> </CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE>q<TT>)</TT><CODE> </CODE><TT>(</TT>p::r<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>erart_aux<CODE> </CODE>l<CODE> </CODE>[]<CODE> </CODE>;;<BR><BR><B>let</B><CODE> </CODE>erart_go<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE>erart<CODE> </CODE><TT>(</TT>Interval.interval<CODE> </CODE><TT>(</TT><CODE>&lt;</CODE><TT>)</TT><CODE> </CODE><CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>x<CODE> </CODE><CODE>+</CODE><CODE> </CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><CODE>2</CODE><CODE> </CODE>n<TT>)</TT><CODE> </CODE>;;<BR><BR><BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> By using the preceding functions, write a
 <A id="a207__5_APPEND/GCcor.ml.tex" href="javascript: void showMessage('5_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/GCcor.ml.tex,era2main -->program</SPAN></A> (change the name) 
 that takes the name of a file and
 a list of numbers on the command line and calculates, for each number
 given, the list of prime numbers smaller than it. This function
 creates a garbage collection trace in the indicated file.
Trace commands from previous exercice are gathered in file <TT><A id="a208__6_APPEND/GCcor.ml.tex" href="javascript: void showMessage('6_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/GCcor.ml.tex,trgc -->trgc.ml</SPAN></A></TT>  
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 fichier era2_main.ml : <BR>
<BR>


<PRE>
<CODE>(* fichier : era2_main.ml *)</CODE><BR><BR><B>open</B><CODE> </CODE>Trgc;;<BR><BR><B>let</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Usage: testgc filename n1 [n2 n3 ... np]n\n"</CODE>;;<BR><BR><B>let</B><CODE> </CODE>main<CODE> </CODE>f<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>Array.length<CODE> </CODE><TT>(</TT>Sys.argv<TT>)</TT><CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><CODE>3</CODE><CODE> </CODE><B>then</B><CODE> </CODE>usage()<BR><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>fn<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>1</CODE><TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>vn<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.map<CODE> </CODE>int_of_string<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>Array.sub<CODE> </CODE>Sys.argv<CODE> </CODE><CODE>2</CODE><CODE> </CODE><TT>(</TT>Array.length<CODE> </CODE>Sys.argv<CODE> </CODE><CODE>-</CODE><CODE> </CODE><CODE>2</CODE><TT>)</TT><TT>)</TT><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>oc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_out<CODE> </CODE>fn<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Array.map<CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>n<CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>f<CODE> </CODE><CODE> </CODE>n<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>trace_out_gc<CODE> </CODE>oc;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>r<TT>)</TT><CODE> </CODE>vn<CODE> </CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_out<CODE> </CODE>oc<CODE> </CODE>;;<BR><BR><BR><BR><BR>

</PRE>
<BR>
<BR>
fichier main_rt.ml : <BR>
<BR>


<PRE>
<CODE>(* fichier main_rt.ml *)</CODE><BR><BR>Era2_main.main<CODE> </CODE>Eras2.erart_go;;

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 

<PRE>
<CODE>(* fichier trgc.ml *)</CODE><BR><BR><B>type</B><CODE> </CODE>tr_gc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{etat<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Gc.stat;<CODE> </CODE>temps<CODE> </CODE><CODE>:</CODE><CODE> </CODE>float;<CODE> </CODE>numero<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int}<CODE> </CODE>;;<BR><B>let</B><CODE> </CODE>trace_gc<CODE> </CODE><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>num<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>function</B><CODE> </CODE>()<CODE> </CODE>-&gt;<CODE> </CODE>incr<CODE> </CODE>num;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>etat<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Gc.stat<CODE> </CODE>();<CODE> </CODE><CODE> </CODE>temps<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Unix.time();<CODE> </CODE>numero<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>!</CODE>num}<CODE> </CODE>;;<BR><BR><B>let</B><CODE> </CODE>trace_out_gc<CODE> </CODE>oc<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>trgc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>trace_gc<CODE> </CODE>()<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Marshal.to_channel<CODE> </CODE>oc<CODE> </CODE><CODE> </CODE>trgc<CODE> </CODE>[];;<BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a209__7_APPEND/GCcor.ml.tex" href="javascript: void showMessage('7_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/GCcor.ml.tex,comprt -->Compile</SPAN></A> these files and create a stand-alone 
executable; test it with the following call,
and <A id="a210__8_APPEND/GCcor.ml.tex" href="javascript: void showMessage('8_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/GCcor.ml.tex,tracert -->display</SPAN></A> the result. 
<PRE>                                                           %
erart trace_rt 3000 4000 5000 6000
</PRE><!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 Compilation pour Unix : 
<PRE>
$ ocamlc -custom -o erart unix.cma interval.ml trgc.ml eras2.ml era2_main.ml main_rt.ml -cclib -lunix

</PRE></span><script language="JavaScript"><!--
  closePopUp("7_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 Test : 
<PRE>
$ erart traceRT 3000 4000 5000 6000
</PRE>R�sultats : 
<PRE>
$ visu traceRT 
Nombre de Gc: mineur = 130, majeur = 22
</PRE></span><script language="JavaScript"><!--
  closePopUp("8_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Do the same <A id="a211__9_APPEND/GCcor.ml.tex" href="javascript: void showMessage('9_APPEND/GCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/GCcor.ml.tex,NRT -->work</SPAN></A> for the non tail recursive function.  
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 On reprend le fichier eras.ml, de la page <A HREF="book-ora078.html#exo-eratosthene">??</A>, 
contenant une fonction de calcul non r�cursive terminale.<BR>
<BR>
Puis on cr�e le fichier main_nrt.ml suivant :


<PRE>
<CODE>(* fichier main_nrt.ml *)</CODE><BR><BR>Era2_main.main<CODE> </CODE>Eras.era_go;;<BR>

</PRE>
<BR>
<BR>
Compilation : 
<PRE>
$  ocamlc -custom -o eranrt unix.cma interval.ml trgc.ml eras.ml era2_main.ml main_nrt.ml -cclib -lunix
</PRE>Test : 
<PRE>
$ eranrt traceNRT 3000 4000 5000 6000
</PRE>R�sultats (version 2.04/Unix) : 
<PRE>
$ visu traceNRT 
Nombre de Gc: mineur = 130, majeur = 10
</PRE></span><script language="JavaScript"><!--
  closePopUp("9_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Compare trace results.
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/GCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/GCcor.ml.tex","");
// --></script><span style="">
 Les deux programmes allouent les m�mes donn�es : ils ont le m�me nombre de GC mineurs.
La version r�cursive terminale effectue plus de GC majeurs. En effet, l'accumulateur 
<TT>r</TT> de la fonction <TT>erart_rt</TT> est �valu� dans l'appel r�cursif et 
sa t�te de liste est rang�e dans la zone des valeurs anciennes � chaque GC mineur. 
Le filtrage des multiples d'un nombre peut entra�ner un GC mineur 
qui fait vieillir la liste filtr�e en cours de construction. Les anciennes
listes filtr�es sont
lib�r�es pendant un GC majeur. Ainsi l'espace 
m�moire de la g�n�ration ancienne qui contient la liste des nombres 
premiers d�j� trouv�s est plus petit ce qui augmente le nombre de GC majeurs.<BR>
<BR>
Ce cas est particulier <BR>
<BR>
L'�criture d'une fonction r�cursive sous forme r�cursive terminale fait gagner 
en allocation de pile, mais pas forc�ment en nombre de GC.
</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/GCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL> <HR>
<A HREF="book-ora089.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora091.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
